#include <iostream>
#include <unordered_map>

using namespace std;
// 3. 无重复字符的最长子串
// 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int maxLength = 0;
        int lastIndex = 0;
        unordered_map<char,int> record;
        for(int i = 0; i < s.size(); i++) { // 滑动窗口是[lastIndex,i]
            char ch = s[i];
            if(record.count(ch) == 1) {
                lastIndex = max(record[ch] + 1, lastIndex);
            }
            record[ch] = i;
            int curLength = i - lastIndex + 1;
            if(maxLength < curLength)
                maxLength = curLength;
        }
        return maxLength;
    }
};
int main() {
    std::cout << Solution().lengthOfLongestSubstring("abcabcbb") << std::endl;  // 无重复字符的最长子串是 "abc"，所以其长度为 3。
    std::cout << Solution().lengthOfLongestSubstring("bbbbb") << std::endl;  // 无重复字符的最长子串是 "b"，所以其长度为 1。
    std::cout << Solution().lengthOfLongestSubstring("pwwkew") << std::endl;  // 无重复字符的最长子串是 "wke"，所以其长度为 3。

    return 0;
}
